#include <sys/select.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
    fd_set set;
    // 1.清空set集合
    FD_ZERO(&set);
    // 2.将要等待的文件描述符加入set集合中
    FD_SET(0, &set);
    for (;;)
    {
        printf("> ");
        fflush(stdout);
        // 4.开始等待文件描述符就绪
        int ret = select(1, &set, NULL, NULL, NULL);
        if (ret < 0)
        {
            perror("select");
            sleep(1);
            continue;
        }
        // 5.有文件描述符就绪了
        if (FD_ISSET(0, &set))
        {
            // 是我们要的0号文件描述符，可以开始读取数据了
            char buf[1024] = {0};
            read(0, buf, sizeof(buf) - 1);
            printf("input: %s", buf);
        }
        else
        {
            // 不是我们要的文件描述符
            printf("error! invaild fd\n");
            continue;
        }
        // 6.再次清空set集合，因为没就绪的fd在select返回时会被清理掉
        FD_ZERO(&set);
        // 7.再次将要等待的文件描述符加入set集合
        FD_SET(0, &set);
    }
    return 0;
}